package cn.lingyangwl.agile.infra;

import cn.lingyangwl.agile.infra.common.*;
import cn.lingyangwl.agile.infra.module.datamanage.db.*;
import cn.lingyangwl.agile.infra.module.file.model.rqrs.*;
import cn.lingyangwl.agile.infra.module.group.model.rqrs.*;
import cn.lingyangwl.agile.infra.module.misc.*;
import cn.lingyangwl.agile.model.enums.*;
import org.springframework.web.bind.annotation.RequestParam;

import java.util.List;
import java.util.Optional;

/**
 * @author shenguangyang
 */
public interface InfraApi {
    // ====================================================== 素材管理
    /**
     * 通过id获取媒体素材
     * @param id 素材id
     * @return 素材
     */
    MediaMaterialResp getMediaMaterial(@RequestParam(value = "id") Long id);

    // ====================================================== 通用数据组管理
    /**
     * 保存 通用数据组
     *
     * @param req 新增的记录
     * @return 是否保存成功
     */
    Long saveDataGroup(DataGroupSaveReq req);

    /**
     * 通过父id获取所有子id
     * @param parentId 父id
     * @return 所有子节点数据
     */
    List<DataGroupDto> listChildrenDataGroup(Long parentId);

    /**
     * 获取数据组
     */
    List<DataGroupDto> listDataGroup(DataGroupQuery req);

    /**
     * 更新 通用数据组
     *
     * @param req 修改的记录
     * @return 是否更新成功
     */
    boolean updateDataGroup(DataGroupUpdateReq req);

    /**
     * 获取 通用数据组
     *
     * @param id 主键
     * @return 是否删除成功
     */
    DataGroupDto getDataGroup(Long id);

    /**
     * 删除 通用数据组
     * @param id 主键
     * @return 是否删除成功
     * @see DataGroupBizTypeEnum
     */
    @SuppressWarnings("all")
    boolean deleteDataGroup(DataGroupBizTypeEnum type, Long id);

    /**
     * 批量删除 通用数据组
     *
     * @param ids 主键集合
     * @return 是否删除成功
     */
    @SuppressWarnings("all")
    boolean batchDeleteDataGroup(DataGroupDeleteReq req);

    // ====================================================== 文件管理
    /**
     * 获取内网可访问的完整url
     * @return 返回的是baseUrl, eg: <a href="http://127.0.0.1:9090/minio/">minio<a/>
     */
    String getFileIntranetUrl(String filePath);

    /**
     * 通过文件上传路径查询查找 文件上传记录
     * @param isIntranet 是否为内网
     */
    FileRecordResp getFileRecordByPath(String path, boolean isIntranet);

    /**
     * 文件文件路径删除
     */
    void deleteFileRecordByPath(String path);

    // ====================================================== 微信
    /**
     * 获取当前配置的公众号账号二维码
     * @return 二维码链接
     */
    String getMpQrcode(ScanScene req);


    // ====================================================== id生成器 workId相关

    /**
     * 获取id生成器的下一个workId
     * @return -1或者为空则生成失败
     */
    Short getIdGenNextWorkId();

    /**
     * 刷新id生成器workId被占用时间
     * @param workId 当前服务所被分配的workId值
     */
    void refreshIdGenWorkId(Short workId);

    /**
     * 获取sql上下文
     */
    List<SQLContext> listSqlContext(Long datasourceId, List<String> tableNames);


    // ===================================================== 公共部分
    Optional<Ip2RegionDto> ip2Region(String ip);
}
